package cn.growthgate.fgo.util;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Date;

import org.springframework.web.multipart.MultipartFile;

/**
 * 文件操作工具类
 * 
 * @author GrowthGate
 * @since 2019年4月21日
 *
 */
public class FileUtils {

	public static final String BASE_PATH = "userfile";
	
	/**
	 * 获取项目根目录
	 * @return
	 */
	public static String getRootPath() {
		return new File("").getAbsolutePath();
	}
	
	/**
	 * 获取上传文件的目录
	 * @return
	 */
	public static String getUploadDir() {
		return BASE_PATH + File.separator
				+ DateUtils.toString(new Date(), "yyyy" + File.separator + "MM" + File.separator + "dd");
	}
	
	/**
	 * 上传文件到项目中
	 * 
	 * @param multipartFile
	 * @return
	 */
	public static File uploadFile(MultipartFile multipartFile) {
		// 创建父文件夹
		String uploadDir = getUploadDir();
		File parent = new File(uploadDir);
		if (!parent.exists()) {
			parent.mkdirs();
		}
		
		String originalFilename = multipartFile.getOriginalFilename();
		// 保留后缀名
		String ext;
		int dot = originalFilename.lastIndexOf(".");
		if (dot != -1) {
			ext = originalFilename.substring(dot);
		} else {
			ext = "";
		}
		
		File file;
		do {
			// 生成随机文件名
			String newName = StringUtils.getRandomUUID();
			file = new File(parent, newName + ext);
		} while (!createNewFile(file));
		
		try {
			// MultipartFile转File（必须使用绝对路径）
			file = file.getAbsoluteFile();
			multipartFile.transferTo(file);
			return file;
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	
    private static boolean createNewFile(File f) {
        try {
            return f.createNewFile();
        } catch (IOException ignored) {
            return false;
        }
    }
    
	/**
	 * 获取文件绝对路径
	 * @param filepath
	 * @return
	 */
	public static String getAbsolutelyPath(String filepath) {
		File file = new File(filepath);
		return file.getAbsolutePath();
	}
	
	/**
	 * 获取文件绝对路径
	 * @param file
	 * @return
	 */
	public static String getAbsolutelyPath(File file) {
		return file.getAbsolutePath();
	}
	
	/**
	 * 获取文件相对路径
	 * @param filepath
	 * @return
	 */
	public static String getRelativePath(String filepath) {
		File file = new File(filepath);
		if (file.isAbsolute()) {
			String rootPath = getRootPath() + File.separator;
			return filepath.replace(rootPath, "");
		} else {
			return filepath;
		}
	}
	
	/**
	 * 获取文件相对路径
	 * @param file
	 * @return
	 */
	public static String getRelativePath(File file) {
		return getRelativePath(file.getPath());
	}
    
	/**
	 * 删除文件
	 * @param file
	 * @return
	 */
	public static boolean delete(File file) {
		return delete(file, false);
	}
	
	/**
	 * 删除文件并删除为空的父文件夹
	 * @param file
	 * @param deleteParent
	 * @return
	 */
	public static boolean delete(File file, boolean deleteParent) {
		boolean isSuccess = true;
		if (file.exists()) {
			if (file.isFile()) {
				isSuccess = file.delete();
			} else {
				for (File child : file.listFiles()) {
					isSuccess = delete(child) ? isSuccess : false;
				}
				file.delete();
			}
			if (isSuccess && deleteParent) {
				// 如果父文件夹为空，删除父文件夹
				File parent = file.getParentFile();
				if (parent.listFiles().length == 0) {
					isSuccess = delete(parent, true);
				}
			}
		}
		return isSuccess;
	}
	
	/**
	 * 根据文件获取content-type
	 * @param file
	 * @return
	 * @throws IOException
	 */
	public static String getContentType(File file) throws IOException {
		return Files.probeContentType(file.toPath());
	}

}
